В общем суть такова, что стандартная настройка DSM меня совершенно не устраивает. Особенно вариант, что все службы (или приложения) разбросаны по разным портам (от 5000 до 9000) и приходится эти порты пробрасывать на роутере. Так-же не устраивает, что все службы доступны по любому адресу привязанному к DSM (особенно если у вас там есть несколько различных сайтов). Получается примерно следующая картинка:
Вы можете попасть на свой DSM и нужную службу по любому из адресов и только так:
- site1.mydomain.com:5000
- site2.mydomain.com:7000
…
и т.д.
Учитывая еще тот факт, что на корпоративном прокси у нас закрыто всё, кроме 80 и 443 порта - данный вариант мне совершенно не подходил.
Хотелось больше возможностей виртуальных хостов и вынести все ресурсы на стандартные порты.
Стандартными средствами - сделать этого я не смог. Ибо все службы жестко настроены и мы, кроме как поменять номер порта, больше ничего и не можем. А, ну и в 5.1 DSM заметил, что можно назначить приложения на виртуальную папку, которая всё равно перебросит вас на адрес: site:port.
Идея у меня была проста. Чтобы при обращении к site1.domain.com открывалась сразу панель управления DSM
Прошерстив форумы, нашел вариант использования reverse proxy (mod_proxy) встроенного в apache DSM.
Взяв полученную информацию за основу, удалось добиться следующего:
http://site1.mydomain.com (стандартный 80 порт) - открывает панель управления DSM (которая весит на 5000 порту)
https://site1.mydimain.com (443 порт) - открывает тоже самое, но на 5001 порту.
Дальше - больше. Хотел сделать что-то типа:
https://site2.mydomain.com - открывает Photostation
https://site3.mydomain.com - открывает Downloadstation
и всё в таком духе…
Но тут столкнулся с тем, что на каждый такой сайт - нужен свой сертификат (а платить кучу денег за multidomain возможности нет)
Тогда я решил попробовать сделать всё таким образом:
https://site1.mydomain.com/ - DSM admin
https://site1.mydomain.com/photo - PhotoStation
https://site1.mydomain.com/download - DownloadStation
https://site1.mydomain.com/webdav - WebDav
https://site1.mydomain.com/music - AudioStation
https://site1.mydomain.com/file - FileStation
И я сделал это! Ниже идут конфиги и небольшая инструкция, как всё это сделано. Решение не идеальное и есть некоторое количество мелких проблем, которые не смог решить. Например:
- По другому адресу, всё-же можно открыть PhotoStation
- Запуск из DSM Admin Photostation - ведёт на локальный адрес.
Но у этого решения есть и плюсы:
- Не надо делать проброску портов во внутреннюю сеть (кроме 80 и 443)
- Всё прекрасно работает с рабочего места за прокси
- Переключение между службами идет не вбиванием соответствующего порта, а простой ссылкой на папку.
Итак. Приступим.
Для начала нам надо создать файл, где будут лежать наш конфиг. Идеальным местом для меня - это папка в home пользователя admin (файл не пропадет при следующем обновлении DSM)
Создаём файл:
/home/admin/configs/httpd_vhosts.conf
Дальше, необходимо добавить его в конфиг httpd сервера.
Редактируем файл:
/etc/httpd/conf/httpd.conf-user
и добавляем в конец строку:
include /var/services/homes/admin/configs/httpd_vhosts.conf
Важный момент: Мы прописываем путь /var/services/homes вместо /volume1/homes потому, что у вас может быть более одного тома и папка homes может находится по другому адресу. /var/services/homes всегда ссылается на верный адрес.
Затем дописываем в файл httpd_vhosts.conf следующее:
# Загружаем модули, если они не загружены
<IfModule !proxy_module>
LoadModule proxy_module modules/mod_proxy.so
</IfModule>
<IfModule !proxy_connect_module>
LoadModule proxy_connect_module modules/mod_proxy_connect.so
</IfModule>
<IfModule !proxy_http_module>
LoadModule proxy_http_module modules/mod_proxy_http.so
</IfModule>
<IfModule !proxy_ftp_module>
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
</IfModule>
# Определяем виртуальный HTTP хост
NameVirtualHost *:80
<VirtualHost *:80>
ServerName site1.mydomain.com
# Добавляем / в конец запроса (если слэша там нет). Без этого, при запросе типа http://site1.mydomain.com/video - откроется пустая страница.
# В нашем случае перебросит на страницу http://site1.mydomain.com/video/
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?download$ /download/ [r]
RewriteRule ^/?webdav$ /webdav/ [r]
RewriteRule ^/?photo$ /photo/ [r]
RewriteRule ^/?music$ /music/ [r]
RewriteRule ^/?video$ /video/ [r]
RewriteRule ^/?surv$ /surv/ [r]
RewriteRule ^/?mail$ /mail/ [r]
RewriteRule ^/?file$ /file/ [r]
# Настраиваем reverse proxy
ProxyRequests Off
ProxyVia Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass /download/ http://localhost:8000/
ProxyPass /webdav/ https://localhost:5005/
ProxyPass /photo/ http://localhost/photo/
ProxyPass /music/ http://localhost:8800/
ProxyPass /video/ http://localhost:9007/
ProxyPass /surv/ http://localhost:9900/
ProxyPass /mail/ http://localhost/mail/
ProxyPass /file/ http://localhost:7000/
ProxyPass / http://localhost:5000/
ProxyPassReverse / http://localhost:5000/
</VirtualHost>
# Здесь настраивает всё тоже самое, но для HTTPS
<IfDefine SSL>
NameVirtualHost *:443
<VirtualHost *:443>
ServerName site1.mydomain.com
SSLEngine on
SSLProxyEngine on
SSLProtocol all -SSLv2
# Обязательно убедитесь в наличии файлов сертификатов
SSLCertificateFile /usr/syno/etc/ssl/ssl.crt/server.crt
SSLCertificateKeyFile /usr/syno/etc/ssl/ssl.key/server.key
SSLCACertificateFile /usr/syno/etc/ssl/ssl.intercrt/server-ca.crt
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?download$ /download/ [r]
RewriteRule ^/?webdav$ /webdav/ [r]
RewriteRule ^/?photo$ /photo/ [r]
RewriteRule ^/?music$ /music/ [r]
RewriteRule ^/?video$ /video/ [r]
RewriteRule ^/?surv$ /surv/ [r]
RewriteRule ^/?mail$ /mail/ [r]
RewriteRule ^/?file$ /file/ [r]
ProxyRequests Off
ProxyVia Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass /download/ https://localhost:8001/
ProxyPass /webdav/ https://localhost:5006/
ProxyPass /photo/ https://localhost/photo/
ProxyPass /music/ https://localhost:8801/
ProxyPass /video/ https://localhost:9008/
ProxyPass /surv/ https://localhost:9901/
ProxyPass /mail/ https://localhost/mail/
ProxyPass /file/ https://localhost:7001/
ProxyPass / https://localhost:5001/
ProxyPassReverse / https://localhost:5001/
</VirtualHost>
</IfDefine>
ADD1: Также, для функционирования https host - надо закоментить две строки в /etc/httpd/conf/extra/httpd-ssl.conf-user
# ServerName * # ServerAlias *
Без этого работать не будет.
После того, как сохраним файл, перезапускаем web службы командой:
synoservicectl --restart httpd-user
Если ошибок не будет - то можете пользоваться!
P.S. С удовольствием жду замечания/дополнения/исправления/вопросы